#include <iostream>
#include <memory>
#include <signal.h>

#include "capture.hpp"
#include "display.hpp"
#include "../utils/logger_helper.hpp"

#undef LOG_TAG
#define LOG_TAG "Main"

// 全局对象
extern logger_helper logger;  // 改为extern声明
std::shared_ptr<CaptureInterface> capture;
std::shared_ptr<Display> display;
bool running = true;

// 信号处理函数
void signalHandler(int signum) {
    LOG_I << "接收到信号: " << signum << LOG_END;
    running = false;
}

int main() {
    // 初始化日志系统
    logger.init_logger();
    LOG_I << "程序启动" << LOG_END;
    
    // 注册信号处理
    signal(SIGINT, signalHandler);
    signal(SIGTERM, signalHandler);
    
    try {
        // 创建模块实例
        capture = std::make_shared<CaptureInterface>();
        display = std::make_shared<Display>(true, false); // 启用窗口显示，禁用视频录制
        
        // 初始化模块
        if (capture->init() != 0) {
            LOG_E << "图像捕获模块初始化失败" << LOG_END;
            return -1;
        }
        
        if (display->init() != 0) {
            LOG_E << "显示模块初始化失败" << LOG_END;
            return -1;
        }
        
        // 启动模块
        capture->start();
        display->start();
        
        LOG_I << "所有模块启动成功" << LOG_END;
        
        // 主循环
        cv::Mat frame;
        while (running) {
            try {
                capture->get(frame);
                if (!frame.empty()) {
                    display->put(frame);
                }
            } catch (const std::exception& e) {
                LOG_E << "处理帧时出错: " << e.what() << LOG_END;
                break;
            }
            
            // 检查ESC键退出
            int key = cv::waitKey(1) & 0xFF;
            if (key == 27) { // ESC键
                break;
            }
        }
        
    } catch (const std::exception& e) {
        LOG_E << "程序异常: " << e.what() << LOG_END;
    }
    
    // 清理资源
    if (capture) capture->stop();
    if (display) display->stop();
    
    LOG_I << "程序正常退出" << LOG_END;
    return 0;
}